Amazon Aurora PostgreSQLをHashiCorp Vault Serverのストレージにする
はじめに
Vault ServerはストレージとしてPostgreSQLが使えます。今回はAmazon Aurora PostgreSQLをストレージとして使ってみます。
やってみた
Amazon Aurora PostgreSQLの準備
以下のようにAmazon Aurora PostgreSQLを構築しました。またセキュリティグループの設定で、Vault ServerとなるEC2から接続を許可しておきます。
サーバ側の作業
Vault Server起動時に指定するConfigファイルを作成します。storage項目でPostgreSQLを指定します。また前回同様にオレオレ証明書でTLSを有効にしています。
storage "postgresql" { connection_url = "postgres://ADMIN:PASSWORD@aurora-postgresql.XXXXX.ap-northeast-1.rds.amazonaws.com:5432/vault" } listener "tcp" { address = "EC2のプライベートIPアドレス:8200" tls_cert_file = "/home/ec2-user/vault-server.crt" tls_key_file = "/home/ec2-user/vault-server.key" }
PostgreSQLを使う場合のパラメータは以下の通りです。
- connection_url ... PostgreSQLに接続するための情報。ユーザー名とパスワードもここに含めます。
- table ... Vaultが使うテーブル名。デフォルト値はvault_kv_store。存在しない場合に作ってくれるわけではないので、事前に作っておく必要があります。
- max_parallel ... 最大同時並行接続数。デフォルト値は128。
Vault Serverを起動します。Storageがpostgresqlになっています。
$ sudo ./bin/vault server -config=config.hcl ==> Vault server configuration: Cgo: disabled Listener 1: tcp (addr: "EC2のプライベートIPアドレス:8200", cluster address: "EC2のプライベートIPアドレス:8201", tls: "enabled") Log Level: info Mlock: supported: true, enabled: true Storage: postgresql Version: Vault v0.9.3 Version Sha: 7d73ac4c967b3b8726c71e00c017129e1d36ad3c ==> Vault server started! Log data will stream in below:
この時点ではテーブルが存在しません。
$ psql -h aurora-postgresql.XXXXX.ap-northeast-1.rds.amazonaws.com -U ADMIN -d vault ユーザ ADMIN のパスワード: psql (9.2.24, サーバー 9.6.3) 注意: psql バージョン 9.2, サーバーバージョン 9.6. psql の機能の中で、動作しないものがあるかもしれません。 SSL 接続 (暗号化方式: DHE-RSA-AES256-GCM-SHA384, ビット長: 256) "help" でヘルプを表示します. vault=> \dt; リレーションがありません。 vault=>
上述の通り、Vaultはテーブルを自動作成してくれないので、このままクライアント側でinitializeしようとしてもエラーになります。
$ vault operator init -tls-skip-verify Error initializing: Error making API request. URL: PUT https://EC2のグローバルIPアドレス:8200/v1/sys/init Code: 400. Errors: * failed to check for initialization: pq: relation "vault_kv_store" does not exist
なのでテーブルを作っておきます。
vault=> CREATE TABLE vault_kv_store ( vault(> parent_path TEXT COLLATE "C" NOT NULL, vault(> path TEXT COLLATE "C", vault(> key TEXT COLLATE "C", vault(> value BYTEA, vault(> CONSTRAINT pkey PRIMARY KEY (path, key) vault(> ); CREATE TABLE vault=> CREATE INDEX parent_path_idx ON vault_kv_store (parent_path); CREATE INDEX vault=> \dt; リレーションの一覧 スキーマ | 名前 | 型 | 所有者 ----------+----------------+----------+-------------- public | vault_kv_store | テーブル | smokeymonkey
テーブル構造はこんな感じ。
vault=> \d vault_kv_store; テーブル "public.vault_kv_store" 列 | 型 | 修飾語 -------------+-------+--------------------- parent_path | text | 照合順序 C not null path | text | 照合順序 C not null key | text | 照合順序 C not null value | bytea | インデックス: "pkey" PRIMARY KEY, btree (path, key) "parent_path_idx" btree (parent_path)
クライアント側の作業
Vault Serverのアドレスを環境変数に設定します。
$ export VAULT_ADDR='https://EC2のパブリックIPアドレス:8200'
initializeします。
$ vault operator init -tls-skip-verify
するとテーブルに16件のレコードが作成されます。これはVault Serverの設定などが格納されています。
vault=> select key from vault_kv_store; key ------------------------------------------ keyring master seal-config info jwtkey mounts local-mounts default response-wrapping auth local-auth audit local-audit salt 7ab23650c6b59ddabc660f54b24299ae5d450cc0 7c67e962f48afd4b0e4893ca2cf11df669996527 (16 行)
Unsealして使えるようにします。
$ vault operator unseal -tls-skip-verify $ vault operator unseal -tls-skip-verify $ vault operator unseal -tls-skip-verify
loginします。
$ vault login -tls-skip-verify 6bcc76e3-98d8-3d5d-a8e1-a15ad3cc9ac8
さて、それでは実際に値を格納してみます。
$ vault write -tls-skip-verify secret/sasakidaisuke value=smokeymonkey Success! Data written to: secret/sasakidaisuke
するとkeyがKey名から始まるレコードが作成されます。valueは暗号化されており読めません。
vault=> select * from vault_kv_store where key='sasakidaisuke'; parent_path | path | key | value -------------+------------------------------------------------+---------------+--------------------------------------------- ------------------------------------------------------------------------- /logical/ | /logical/54cf8082-35ce-276c-886b-eab5522e81e3/ | sasakidaisuke | \x00000001028c77005e83f990818378b8aea9c679c1 dff115259f84948535f382b96dbefac8d300f54d1c5e310864d0506a7c48d187960d62f6 (1 行)
さいごに
PostgreSQLをストレージとして使う場合にはHigh Availability Modeがサポートされません。Aurora自体は信頼性が高いのですがフロントとなるVault Serverの可用性の担保が難しいことを認識しておきましょう。